package com.hanzidong.util;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

public class DateUtil {
	
	/**
	* 功能：根据生日计算年龄
	* 示例：现在是2020-4-23，如果生日是2020-5-20，那结果是19
	* 
	* @param Date，生日
	* @return int 年龄
	*/
	public static int getAge(Date birthday){
		//获取当前时间，创建日历对象
		Calendar calendar = Calendar.getInstance();
		
		//当前的时间的年月日
		int now_year = calendar.get(Calendar.YEAR);
		int now_month = calendar.get(Calendar.MONTH);
		int now_day = calendar.get(Calendar.DAY_OF_MONTH);
		
		//设置日历对象为生日那天
		calendar.setTime(birthday);
		
		//生日的年月日
		int bir_year = calendar.get(Calendar.YEAR);
		int bir_month = calendar.get(Calendar.MONTH);
		int bir_day = calendar.get(Calendar.DAY_OF_MONTH);
		
		//计算年龄
		int age = now_year - bir_year;
		
		//如果生日没到，则年龄减一
		if(bir_month > now_month) {
			age --;
		}
		
		if(bir_month == now_month &&  bir_day > now_day) {
			age --;
		}
		
		return age;
	}
	
	/**
	* 功能：根据生日计算年龄
	* 示例：现在是2020-4-23，如果生日是2020-5-20，那结果是19
	* 
	* @param String，生日   yyyy-MM-dd
	* @return int 年龄
	 * @throws ParseException 
	*/
	public static int getAge(String birthday) throws ParseException{
		
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
		
		//将String字符串转换成Date类型对象
		Date birth = sdf.parse(birthday);
		
		return getAge(birth);
	}
	
	/**
	* 功能：给定时间对象，获取该时间的月初1日0时0分0秒0毫秒
	* 示例：2018-11-11 08:30:16 → 2018-11-01 00:00:00
	* 使用场景：可用在数据库里查询某月的时间范围
	*
	* @param Date 源时间
	* @return Date 月初时间
	*/
	public static Date getFirstDayOfMonth(Date src){
		//获取给定时间的年月
		Calendar calendar = Calendar.getInstance();
		
		//设置日期
		calendar.setTime(src);
		
		//获取年月
		int year = calendar.get(Calendar.YEAR);
		int month = calendar.get(Calendar.MONTH);
		
		//设置这个月的第一天的 0:00:00
		calendar.set(year, month, 1, 0, 0, 0);
		
		return calendar.getTime();
		
	}
	
	
	/**
	* 功能：给定时间对象，获取该时间的月末最后一天的23时23分59秒999毫秒
	* 示例：2018-11-11 08:30:16 → 2018-11-30 23:23:59
	* 使用场景：可用在数据库里查询某月的时间范围
	*
	* @param Date 源时间
	* @return Date 月末时间
	*/
	public static Date getLastDayOfMonth(Date src){
		
		//获取这个月的第一天
		Date firstDayOfMonth = getFirstDayOfMonth(src);
		
		Calendar calendar = Calendar.getInstance();
		
		//获取这个月第一天的日历对象
		calendar.setTime(firstDayOfMonth);
		
		//将月份加1，获取下个月的第一天
		calendar.add(Calendar.MONTH, 1);
		
		//减去1毫秒，即为上个月最后一天的23时23分59秒999毫秒
		calendar.add(Calendar.MILLISECOND, -1);
		
		return calendar.getTime();
	}
	
	/**
	* 功能：获取当前日期指定天数之前或之后的日期，如果参数为负数，则往前回滚。
	* 示例1：当前是2018-08-08，参数days=5，结果是2018-08-13
	* 示例2：当前是2018-08-08，参数days=-4，结果是2018-08-04
	* 
	* @param int days 偏移的天数，如果为负数则往前回滚。
	* @return Date 新日期
	*/
	public static Date offsetDate(int days) {
		//创建日历对象
		Calendar calendar = Calendar.getInstance();
		
		//设置日期
		calendar.add(Calendar.DAY_OF_MONTH, days);
		
		return calendar.getTime();
	}
	
	/**
	* 功能：获取当前季节，如春季、夏季、秋季、冬季。
	* 
	* @return Season 季节
	* 
	* 3-5月是春季，6-8月是夏季，9-11是秋季，12-2是冬季。
	*/
	public static Season getCurrentSeason() {
		//获取当前时间
		Calendar calendar = Calendar.getInstance();
		
		//获取当前月份进行判断 
		int month = calendar.get(Calendar.MONTH) + 1;
		
		if(month >= 3 && month <=5) {
			return Season.春;
			
		}else if(month >= 6 && month <=8) {
			return Season.夏;
			
		} else if(month >= 9 && month <=11) {
			return Season.秋;
			
		}else {
			return Season.冬;
		}
		
	}

	
	/**
	* 功能：获取人性化时间，例如5分钟之内则显示“刚刚”，其它显示16分钟前、2小时前、3天前、4月前、5年前等
	*
	* @param Date date 源时间。
	* @return 人性化时间
	*/
	public static String getDisplayTime(Date date){
		//获取当前时间的毫秒值
		Date now = new Date();
		long now_time = now.getTime();
		
		//获取原时间的毫秒值
		long start_time = date.getTime();
		
		//计算时间差
		long diff = now_time - start_time;
		
		//计算人性化展示
		if(diff / 1000 / 60 / 60 / 24 / 30 / 12  >= 1 ) {
			return  diff / 1000 / 60 / 60 / 24 / 30 / 12 + "年前";
			
		}else if( diff / 1000 / 60 / 60 / 24 / 30 >= 1) {
			return diff / 1000 / 60 / 60 / 24 / 30 + "月前";
			
		}else if( diff / 1000 / 60 / 60 / 24  >= 1) {
			return diff / 1000 / 60 / 60 / 24  + "天前";
			
		}else if( diff / 1000 / 60 / 60 >= 1) {
			return diff / 1000 / 60 / 60 + "小时前";
			
		}else if ( diff / 1000 / 60 >= 5) {
			return diff / 1000 / 60 + "分钟前";
			
		}else {
			return "刚刚";
		}
		
	}
	
	/**
	* 功能：根据字符串类型的日期类型转换成Date类型。默认格式为 yyyy-MM-dd
	* 
	* @param String date 字符串类型的日期类型，默认格式为 yyyy-MM-dd
	* @return Date 新日期
	 * @throws ParseException 
	*/
	public static Date getDateFromString(String date) throws ParseException {
		
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
		
		return sdf.parse(date);
		
	}
	/**
	 * 功能：根据字符串类型的日期类型转换成Date类型。指定日期格式
	 * 
	 * @param String date 字符串类型的日期类型，
	 * @param String pattern 字符串日期的格式
	 * @return Date 新日期
	 * @throws ParseException 
	 */
	public static Date getDateFromString(String date,String pattern) throws ParseException {
		
		SimpleDateFormat sdf = new SimpleDateFormat(pattern);
		
		return sdf.parse(date);
		
	}
	
	/**
	 * 将Date日期类型转换成String日期类型，默认格式为yyyy-MM-dd
	 * @param Date date 日期类型的数据
	 * @return String 字符串类型的日期
	 */
	public static String getStringFromDate(Date date) {
			
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
		
		return sdf.format(date);
			
	}
	
	/**
	 * 功能：将Date日期类型转换成String日期类型。指定日期格式
	 * 
	 * @param Date date Date类型的日期类型，
	 * @param String pattern 字符串日期的格式
	 * @return String 字符串日期
	 */
	public static String getStringFromDate(Date date,String pattern)  {
		
		SimpleDateFormat sdf = new SimpleDateFormat(pattern);
		
		return sdf.format(date);
		
	}
	
}
